#ifndef  _BSP_IIS_H
#define  _BSP_IIS_H

///公共
typedef void (*audio_callback_t)(u8 *ptr, u32 samples, int ch_mode, void *params);

///IIS_TX
void iis_soft_init(void);
void iis_rx_kick_soft_isr(void);

///IIS_RX
typedef struct {
    u8 mic_start;
    cbuf_cfg_t iis_tx_cbuf;
    u8 mute;
    u8 sample_rate;
    u16 samples;
    audio_callback_t callback;
} iis_tx_cfg_t;

void iis_audio_out_init(void);
void iis_tx_pool_init(u8 sample_rate, u16 samples);
void iis_tx_audio_output_callback_set(audio_callback_t callback);
void iis_tx_audio_input(u8 *ptr, u32 samples, int ch_mode, void *params);

typedef struct {
    u8 mic_start;
    cbuf_cfg_t iis_rx_cbuf;
    u8 mute;
    u8 sample_rate;
    u16 samples;
    u8 soft_isr_kick_flag;
    audio_callback_t callback;
} iis_rx_cfg_t;

void iis_rx_input_pool(u8 *ptr, u32 samples, int ch_mode, void *params);
void iis_rx_pool_init(u8 sample_rate, u16 samples);

//iis 基本配置类型
#define IISCFG_TX        BIT(0)
#define IISCFG_RX        BIT(1)
#define IISCFG_SRC       BIT(2)
#define IISCFG_DMA       BIT(3)
#define IISCFG_MASTER    BIT(7)   //master or slave sel: 1 master, 0 slave
//iis组合类型
#define IISCFG_RAMTX    (IISCFG_TX | IISCFG_DMA)
#define IISCFG_RAMRX    (IISCFG_RX | IISCFG_DMA)
//iis MASK BIT
#define IISCFG_TXMASK   (IISCFG_TX | IISCFG_SRC | IISCFG_DMA)
#define IISCFG_RXMASK   (IISCFG_RX | IISCFG_DMA)
#define IISCFG_TXRXMASK (IISCFG_TX | IISCFG_RX  | IISCFG_SRC | IISCFG_DMA)

#define IISCON0         SFR_RW (SFR5_BASE + 0x00*4)
#define IISBAUD         SFR_RW (SFR5_BASE + 0x01*4)
#define IISDMACNT       SFR_RW (SFR5_BASE + 0x02*4)
#define IISDMAOADR0     SFR_RW (SFR5_BASE + 0x03*4)
#define IISDMAOADR1     SFR_RW (SFR5_BASE + 0x04*4)
#define IISDMAIADR0     SFR_RW (SFR5_BASE + 0x05*4)
#define IISDMAIADR1     SFR_RW (SFR5_BASE + 0x06*4)
#define BIT(n)                  (1ul << (n))
#define SETB(REG,POS)           ((REG) |= (1ul << (POS)))
#define CLRB(REG,POS)           ((REG) &= (~(1ul << (POS))))
#define XORB(REG,POS)           ((REG) ^= (1ul << (POS)))
#define CKB1(REG,POS)            REG & (1ul << POS))     //检测相应的BIT是否为1
#define CKB0(REG,POS)           (!(REG & (1ul << POS)))  //检测相应的BIT是否为1
#define AUBUFSIZE       SFR_RW (SFR1_BASE + 0x04*4)
#define PHASECOMP       SFR_RW (SFR1_BASE + 0x18*4)
#define AUBUFDATA       SFR_RW (SFR1_BASE + 0x01*4)
#define AUBUFCON        SFR_RW (SFR1_BASE + 0x02*4)
#define AUBUFSTARTADDR  SFR_RW (SFR1_BASE + 0x03*4)
#define AUBUFSIZE       SFR_RW (SFR1_BASE + 0x04*4)
#define AUBUFFIFOCNT    SFR_RW (SFR1_BASE + 0x05*4)

//        G1    G2    G3
//DI  :   PA3   PB2   PB5
//DO  :   PA7   PE7   PE7
//BCLK:   PA5   PE5   PB2
//LRCLK:  PA6   PE6   PE6
//MCLK:   PA4   PB1   PB1

//iis一共有可以配置出8种用法
typedef enum {  //iis_mode
   IIS_MASTER_SRCTX = (IISCFG_MASTER |IISCFG_TX |IISCFG_SRC),
   IIS_MASTER_RAMTX = (IISCFG_MASTER |IISCFG_TX |IISCFG_DMA),
   IIS_MASTER_RAMTX_RAMRX = (IISCFG_MASTER | IISCFG_TX | IISCFG_RX | IISCFG_DMA),
   IIS_MASTER_SRCTX_RAMRX = (IISCFG_MASTER | IISCFG_TX | IISCFG_SRC | IISCFG_RX | IISCFG_DMA),
   IIS_MASTER_RAMRX =  (IISCFG_MASTER | IISCFG_RX | IISCFG_DMA),
   IIS_SLAVE_RAMRX = IISCFG_RAMRX,
   IIS_SLAVE_RAMTX = IISCFG_RAMTX,
   IIS_SLAVE_RAMTX_RAMRX = (IISCFG_TX | IISCFG_RX | IISCFG_DMA),
}TYPE_IIS_MODE;

typedef enum{
    IIS_MCLK_OUT_DIS = 0,
    IIS_MCLK_OUT_EN =  1,  //只有MASTER模式才可能输出MCLK
}TYPE_MCLK_OUT_SEL;

typedef struct {
    u16 samples;
    u16 dmabuf_len;
    u8* dmabuf_ptr;  //TX_RX同时存在时前一半是TX,后一版半是RX, 如果只有TX或RX,则全部用于TX或RX
    void(*iis_isr_rx_callbck)(void *buf, u32 samples, bool iis_32bit);   //rx_dma收完一个DMA后起中断,可以从buf中取出接收到数据
    void(*iis_isr_tx_callbck)(void *buf, u32 samples, bool iis_32bit);   //tx_dma发送完一个DMA后起中断,要求向buf中填入数据,以备下一次发送
    volatile u32 txbuf_idx;
    volatile u32 rxbuf_idx;
}iis_dma_cfg_t;

typedef struct {
    u8 mode;
    u8 iomap        : 2;
    u8 bit_mode     : 1;
    u8 data_mode    : 1;
    u8 mclk_sel     : 2;
    u8 mclk_out_en  : 1;
    u8 dma_en       : 1;
    //DMA_CFG
    iis_dma_cfg_t   dma_cfg;
}iis_cfg_t;

//对外API接口函数
void iis_cfg_init(iis_cfg_t *cfg);
void iis_start(void);
void iis_stop(void);
void iis_audio_in_init(void);
#endif
